package hotel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.sql.*;
import java.util.GregorianCalendar;
import java.util.ListIterator;
import java.util.Vector;

import javax.swing.*;

public class FinestraCamera extends JFrame implements ActionListener {
	public GraficaHotel g;
	private GregorianCalendar gc = new GregorianCalendar();
	private MyResultSet rs = null;
	private static String numeroC;
	private JPanel pannelloPrincipale, pannelloDettagli, pannelloClienti,
			pannelloBottoni;
	private JLabel numeroL, numeroPostiL, numeroPostiOccupatiL, matrimonialeL,
			statoL, prezzoL;
	private JCheckBox boxStorico;
	private ImageIcon iconav = new ImageIcon("Risorse/iconav.png"),
			iconax = new ImageIcon("Risorse/iconax.png"),
			iconai = new ImageIcon("Risorse/iconai.png"),
			iconae = new ImageIcon("Risorse/iconae.png"),
			checkInImg = new ImageIcon("Risorse/checkInImg.png"),
			checkOutImg = new ImageIcon("Risorse/checkOutImg.png"),
			prenotImg = new ImageIcon("Risorse/prenotImg.png");;
	private String[] clientiInCamera;
	DefaultListModel<String> modelList;
	private JList<String> lista;
	private JTextField numero, numeroPosti, numeroPostiOccupati, matrimoniale,
			stato, prezzo;
	private JButton checkIn, checkOut, prenotazione;

	public FinestraCamera(final GraficaHotel g, String numeroC) {
		this.g = g;
		this.numeroC = numeroC;
		Image immagineIc = Toolkit.getDefaultToolkit().getImage(
				"Risorse/camera.png");
		setIconImage(immagineIc);
		setTitle("Camera " + numeroC);
		g.setEnabled(false);
		g.setFocusableWindowState(false);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				g.setEnabled(true);
				g.setFocusableWindowState(true);
				dispose();
			}
		});
		setLocation(350, 200);
		setVisible(true);
		setResizable(false);
		pannelloPrincipale = new JPanel();
		pannelloDettagli = new JPanel();
		pannelloClienti = new JPanel();
		pannelloBottoni = new JPanel();
		pannelloPrincipale.setLayout(new BorderLayout());
		pannelloDettagli.setLayout(new GridLayout(15, 2));
		add(pannelloPrincipale);
		pannelloPrincipale.add(pannelloDettagli, BorderLayout.WEST);
		pannelloPrincipale.add(pannelloClienti, BorderLayout.EAST);
		// numero
		numeroL = new JLabel("Numero");
		numero = new JTextField(10);
		numero.setEditable(false);
		pannelloDettagli.add(numeroL);
		pannelloDettagli.add(numero);
		// numero Posti
		numeroPostiL = new JLabel("Numero posti");
		numeroPosti = new JTextField(10);
		numeroPosti.setEditable(false);
		pannelloDettagli.add(numeroPostiL);
		pannelloDettagli.add(numeroPosti);
		// numero Posti Occupati
		numeroPostiOccupatiL = new JLabel("Numero posti occupati");
		numeroPostiOccupati = new JTextField(10);
		numeroPostiOccupati.setEditable(false);
		pannelloDettagli.add(numeroPostiOccupatiL);
		pannelloDettagli.add(numeroPostiOccupati);
		// matrimoniale
		matrimonialeL = new JLabel("Matrimoniale");
		matrimoniale = new JTextField(5);
		matrimoniale.setEditable(false);
		pannelloDettagli.add(matrimonialeL);
		pannelloDettagli.add(matrimoniale);
		// stato
		statoL = new JLabel("Stato");
		stato = new JTextField(20);
		stato.setEditable(false);
		pannelloDettagli.add(statoL);
		pannelloDettagli.add(stato);

		// checkIn
		checkIn = new JButton("Check-in");
		checkIn.setIcon(checkInImg);
		checkIn.addActionListener(this);
		pannelloBottoni.add(checkIn);
		// checkOut
		checkOut = new JButton("Check-out");
		checkOut.setIcon(checkOutImg);
		checkOut.addActionListener(this);
		pannelloBottoni.add(checkOut);
		// prenotazione
		prenotazione = new JButton("Prenotazione");
		prenotazione.addActionListener(this);
		prenotazione.setIcon(prenotImg);
		pannelloBottoni.add(prenotazione);
		pannelloPrincipale.add(pannelloBottoni, BorderLayout.SOUTH);

		// prezzo
		prezzoL = new JLabel("Prezzo");
		prezzo = new JTextField(8);
		prezzo.setEditable(false);
		pannelloDettagli.add(prezzoL);
		pannelloDettagli.add(prezzo);

		// boxPrenotazione
		boxStorico = new JCheckBox("IN STORICO DOPO CHECK-OUT", true);
		pannelloDettagli.add(boxStorico);

		riempiFinestra();
		clienti();
		modelList = new DefaultListModel<String>();
		riempiLista();
		lista = new JList<String>(modelList);
		lista.setBorder(BorderFactory.createLoweredBevelBorder());
		lista.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		lista.setPreferredSize(new Dimension(100, 200));
		pannelloClienti.add(lista);
		pack();

	}

	void riempiFinestra() {
		int i = 2;
		String query = "SELECT * FROM " + g.username + ".CAMERE where numero='"
				+ numeroC + "'";
		rs = g.database.querySelect(query);
		if (rs.next()) {
			numero.setText(rs.getString(i++));
			numeroPosti.setText(rs.getString(i++));
			numeroPostiOccupati.setText(rs.getString(i++));
			if (rs.getBoolean(i++))
				matrimoniale.setText("Si");
			else
				matrimoniale.setText("No");
			stato.setText(rs.getString(i++));
			prezzo.setText(rs.getString(i++));
		}

	}// riempiFinestra

	public void clienti() {
		try {
			rs = g.database.querySelect("SELECT numerodocumento FROM "
					+ g.username + ".ASSOCIAZIONE where camera='" + numeroC
					+ "'");
			if (!rs.next())
				clientiInCamera=new String[1];
			clientiInCamera = new String[rs.getRow()];
			clientiInCamera[0] = rs.getString(1);
			int i = 1;
			while (rs.next()) {
				clientiInCamera[i] = rs.getString(1);
				i++;
			}

		} catch (ArrayIndexOutOfBoundsException e) {

		}
	}// clienti

	public void riempiLista() {
		for (int i = 0; i < clientiInCamera.length; i++) {
			rs = g.database.querySelect("SELECT nome,cognome FROM "
					+ g.username + ".CLIENTI where numerodidocumento='"
					+ clientiInCamera[i] + "'");
			while (rs.next()) {
				modelList.addElement(rs.getString(1) + " " + rs.getString(2));
			}
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == checkIn) {
			new FinestraCheckIn(numeroC, this, g);
		} else if (e.getSource() == checkOut) {
			if (clientiInCamera.length < 1) {
				JOptionPane.showMessageDialog(null,
						"Non ci sono clienti in questa camera!", "Attenzione",
						JOptionPane.INFORMATION_MESSAGE, iconae);
				this.setVisible(true);
			} else {
				if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(
						null, "Sicuro di voler continuare?", "Avviso",
						JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE,
						iconai))
					try {
						checkOutMain(boxStorico.isSelected());
						aggiornaTabellaCamere();
						aggiornaFinestraCamera();
					} catch (SQLException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
			}
		} else if (e.getSource() == prenotazione) {
			this.setAlwaysOnTop(false);
			new FinestraPrenotazione(numeroC, g);
		}
	}

	private void checkOutMain(Boolean storico) throws SQLException,
			IOException, ClassNotFoundException {
		String dataCorrente = gc.get(GregorianCalendar.YEAR) + "/"
				+ (gc.get(GregorianCalendar.MONTH) + 1) + "/"
				+ gc.get(GregorianCalendar.DAY_OF_MONTH);
		for (int i = 0; i < clientiInCamera.length; i++) {
			g.database.queryUpdate("UPDATE " + g.username
					+ ".CLIENTI SET presente=0 where numerodidocumento='"
					+ clientiInCamera[i] + "'");

			if (storico) {
				rs = g.database
						.querySelect("select datadiarrivo,prezzo from "
								+ g.username
								+ ".clienti c,"+ g.username+".associazione a where c.numerodidocumento='"
								+ clientiInCamera[i]
								+ "' && c.numerodidocumento=a.numerodocumento");
				if (rs.next())
					g.database
							.queryInserimento("INSERT INTO "
									+ g.username
									+ ".STORICO (numerodocumento,numcamera,dataarrivo,datapartenza,prezzo) VALUES ('"
									+ clientiInCamera[i] + "','" + numeroC
									+ "','" + rs.getString(1) + "','"
									+ dataCorrente + "','" + rs.getString(2)
									+ "')");
			}
			g.database
					.queryUpdate("UPDATE "
							+ g.username
							+ ".CAMERE SET numpostioccupati=0,stato='DISPONIBILE' where numero='"
							+ numeroC + "'");
		}
		g.database.queryInserimento("DELETE FROM " + g.username
				+ ".ASSOCIAZIONE where camera='" + numeroC + "'");
		modelList.removeAllElements();
		g.aggiornaColoriCamera(numeroC, Color.GREEN);
	}

	void aggiornaTabellaCamere() throws SQLException, ClassNotFoundException {
		g.modelCamere.setRowCount(0);
		String selezionato = "";
		if (g.boxCamera.getSelectedItem().equals("Numero"))
			selezionato = "numero";
		else if (g.boxCamera.getSelectedItem().equals("Numero Posti"))
			selezionato = "numeroposti";
		if (g.disponibile.isSelected())
			rs = g.database
					.querySelect("SELECT numero,numeroposti,matrimoniale,stato FROM "
							+ g.username
							+ ".camere  WHERE "
							+ selezionato
							+ " like '"
							+ g.cerca.getText()
							+ "%' && stato='DISPONIBILE'");
		else if (g.occupata.isSelected())
			rs = g.database
					.querySelect("SELECT numero,numeroposti,matrimoniale,stato FROM "
							+ g.username
							+ ".camere  WHERE "
							+ selezionato
							+ " like '"
							+ g.cerca.getText()
							+ "%' && stato='OCCUPATA'");
		else
			rs = g.database
					.querySelect("SELECT numero,numeroposti,matrimoniale,stato FROM "
							+ g.username
							+ ".camere  WHERE "
							+ selezionato
							+ " like '" + g.cerca.getText() + "%'");
		int columnCount = 4;
		Vector<String> row;
		while (rs.next()) {
			row = new Vector<String>(columnCount);
			for (int i = 1; i <= columnCount; i++) {
				if (i == 3) {
					if (rs.getBoolean(i)) {
						row.add("Si");
					} else
						row.add("No");
				} else {
					row.add(rs.getString(i));
				}
			}
			g.modelCamere.addRow(row);
		}
		g.tabellaCamere.setModel(g.modelCamere);
	}// aggiornaTabellaCamere

	public void aggiornaFinestraCamera() {
		clienti();
		modelList.setSize(0);
		riempiFinestra();
		riempiLista();
	}
}